'use strict';

const BaseController = require('./base');
const XLSX = require("xlsx");
const dayjs = require('dayjs');
const { Op } = require('sequelize');
class CourseRecordController extends BaseController {
  constructor(ctx) {
    super(ctx, 'courseRecord');
  }

  // 报名课程
  async create() {
    const { ctx } = this;
    const data = ctx.request.body;

    // 检查课程是否存在且可报名
    const course = await ctx.service.course.findOne(data.course_id);
    if (!course) {
      return ctx.error(500,'课程不存在');
    }
    if (course.signed_count >= course.total_count) {
      return ctx.error(500,'课程已报满');
    }

    // 检查是否重复报名
    const exists = await ctx.service.courseRecord.findOne({
      course_id: data.course_id,
      student_id: data.student_id,
      status: 1
    });
    if (exists) {
      return ctx.error(500,'已报名该课程');
    }

    // 创建报名记录并更新课程报名人数
    const result = await ctx.service.courseRecord.signup(data);
    ctx.success(result);
  }

  // 取消报名
  async cancel() {
    const { ctx } = this;
    const id = ctx.params.id;

    const record = await ctx.service.courseRecord.findOne(id);
    if (!record) {
      return ctx.error(500,'报名记录不存在');
    }
    if (record.status === 0) {
      return ctx.error(500,'已取消报名');
    }

    const result = await ctx.service.courseRecord.cancel(id);
    ctx.success(result);
  }
  getPageQuery(query) {
    let where = {}
    if (query.course_id) {
      where.course_id = query.course_id
    }
    if (query.grade) {
      where.grade = query.grade
    }
    if (query.status) {
      where.status = query.status
    }
    if (query.start_time && query.end_time) {
      where.create_time = {
        // 包含开始的0点到结束的23点
        [Op.between]: [dayjs(query.start_time).format('YYYY-MM-DD') + ' 00:00:00', dayjs(query.end_time).format('YYYY-MM-DD') + ' 23:59:59']
      }
    }
    return where
  }

  // 导出Excel
  async exportExcel() {
    const {ctx} = this;
    const XLSX = require('xlsx');
    try {
        // 获取报名记录数据，并关联查询学生、课程和家长信息
        const records = await ctx.model.CourseRecord.findAll({
          where: this.getPageQuery(ctx.query),
          include: [
            {
              model: ctx.model.Student,
              as: 'student'
            },
            {
              model: ctx.model.Parent,
              as: 'parent'
            },
          ],
          order: [
            ['course_name', 'ASC'],
            ['create_time', 'DESC']
          ]
        });
        // 处理数据格式
        const data = records.map(record => {
          const item = record.toJSON();
          return {
            '报名时间': item.create_time,
            '课程名称': item.course_name,
            '上课教师': item.teacher_name,
            '上课时间': item.course_schedule,
            '学生': item.student ? item.student.name : '',
            '学号': item.student ? item.student.student_no : '',
            '性别': item.student ? item.student.gender : '',
            '年级': item.student ? item.student.grade + '年级' : '',
            '班级': item.student ? item.student.class_name : '',
            '家长姓名': item.parent ? item.parent.name : '',
            '家长电话': item.parent ? item.parent.phone : '',
            '状态': item.status ? '已预约' : '已取消',
          };
        });
        // 创建Excel工作表
        const ws = XLSX.utils.json_to_sheet(data);
        const wb = XLSX.utils.book_new();
        XLSX.utils.book_append_sheet(wb, ws, '报名记录');

        // 设置响应头
        ctx.set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        ctx.set('Content-Disposition', 'attachment; filename=course_records.xlsx');

        // 将Excel文件写入响应流
        const buffer = XLSX.write(wb, { type: 'buffer', bookType: 'xlsx' });
        ctx.body = buffer;
    } catch (error) {
      ctx.error(500, '导出失败：' + error.message);
    }
  }

}

module.exports = CourseRecordController;
